import java.util.*;

public class Leet15 {
    public static void main(String[] args) {
        Leet15 l = new Leet15();
//        System.out.println( l.threeSum(new int[]
//                {-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6}));
        System.out.println( l.threeSum(new int[]
                {
                0,0,0}));
    }
    public List<List<Integer>> threeSum(int[] nums) {
        Set<List<Integer>> list = new HashSet<>();
        if(nums.length<3)
            return new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 1 ; i<nums.length-1;i++){
            int a = nums[i];
            int l = i-1;
            int r = i+1;
            while(true){
                int b = nums[l];
                int c = nums[r];
                boolean t = false;
                if(a+b+c==0){
                    int t1 = list.size();
                    List<Integer> li = new ArrayList<>();
                    li.add(b);li.add(a);li.add(c);
                    list.add(li);
                    int t2 = list.size();
                    if ((l==0&&r==nums.length-1))
                        break;
                    if(l>0)
                        l--;
                    if(r<nums.length-1)
                        r++;
                    if (t1!=t2)
                        t = true;

                    continue;
                }else if(a+b+c<0&&r<nums.length-1){
                    r++;
                    t = true;
                }else if(a+b+c>0&&l>0){
                    l--;
                    t = true;
                }
                if(!t&&l>0){
                    l--;
                    continue;
                }
                if(!t&&r<nums.length-1){
                    r++;
                    continue;
                }
                if ((l==0&&r==nums.length-1)){
                    b = nums[l];
                    c = nums[r];
                    if(a+b+c==0){
                        List<Integer> li = new ArrayList<>();
                        li.add(b);li.add(a);li.add(c);
                        list.add(li);
                    }
                    break;
                }


            }
        }
        return new ArrayList<>(list);
    }
}
